iT邦幫忙

2023 iThome 鐵人賽

DAY 11
1
SideProject30

一起成為新世紀文字藝術師:深入玩轉 Unicode 和 OpenType系列 第 11

DAY 11|OpenType Feature (4):上下文替代

  • 分享至 

  • xImage
  •  

前幾天分享的,都是很簡單的替換關係,除非是特別指定哪幾個字符,否則替換範圍都是全局有效的,類似取代功能中的批次替換。

而在今天,我們要介紹上下文替代,是會依照該字符的上下文語境(context)去判斷是否需要替換。換句話說,此 feature 是存在邏輯判斷的。

上下文替代(Contextual Alternates, calt)

舉例來說,像是 jqgy 這些擁有下降部(descender)的拉丁字母,如果同時出現在一起的話,下面可能就會擠在一起,可是和其他字符並排時又看起來好好的。

此時,我們就可以透過 calt 來指定當「特定字符一起出現時」,替換其中的某個字符。

以下面為例,當 gj 接連出現時, j 的下面會太靠近 g,完全沒有留白空間。但我們又不想改動原本 j 的造型,如果是調整 kerning 的話又會相鄰太遠。

這種情況下另外製作 g_yliga 當然也是一種解法,但我們也可以透過 calt,當 g 出現在 j 前面時,將後面的 j 改成 j.ss01,也就是另外一種文體的 j。反之,如果沒有相鄰,就讓兩個字都保持原本的設計即可。

calt 通常預設也是關閉的,需要透過 css 啟用:

.class {
    font-variant-ligatures: contextual;
    -moz-font-feature-settings: "calt";
    -webkit-font-feature-settings: "calt";
    font-feature-settings: "calt";
}

更多玩法

上下文替代(與其類似的 feature 族)可以說是 OpenType 最有趣、最多變化的特性,沒有之一。只要能好好的設定,就能做出許多意想不到的功能。

例如之前 justfont 在愚人節推出的「就是不錯字(吧)」,就是透過判斷一組「詞」的字詞來替換。

ㄒㄩㄣˊㄨㄣˋ 二字來說,正確的寫法應該是 詢問 二字,但常常會有使用者打成 尋問。此時,我們就可以透過 calt 特性,讓字型判斷當 出現在一起的時候,將前者的 替換成 ;而若兩者沒有放在一起的話,就保持原狀就好。

不過呢!即使已經從上下文來決定要不要替代,但有時候還是要處理例外狀態,萬一有使用者想輸入 千尋問鍋爐爺爺能不能在這裡工作 這樣的字怎麼辦?如果什麼都不管的話,千尋 就變成 千詢 了,此時,就必須另外撰寫例外原則,我們在更之後的日子裡會更進一步的探討這個議題。

另一個例子是,有許多號稱簡體轉繁體的字型(許多裝置不允許線上翻譯,此時直接換字型是最快的),其實就是在簡體中文的碼位裡內放入繁體中文的字形,但由於簡體字和繁體字並不是一對一映射的關係,常常會出現 皇後辛醜年 這樣的機翻笑話,如果可以透過詞庫來組成 calt 規則,便能解決類似的誤會。

總之,在使用 calt 這種帶有邏輯、會考慮上下文字的 feature 時,最好對該語言和文字有一定程度的理解——在使用科技之餘,也不應該罔顧人文——否則就會出現笑話了。


上一篇
DAY 10|OpenType Feature (3):字母系列
下一篇
DAY 12|OpenType Feature (5):豎排
系列文
一起成為新世紀文字藝術師:深入玩轉 Unicode 和 OpenType30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言